home *** CD-ROM | disk | FTP | other *** search
/ Chip 2005 June / ccd0605.iso / Software / Freeware / Programare / highlight / highlight-W32GUI-2.2-10b-Setup.exe / {app} / src / xslfogenerator.cpp < prev    next >
C/C++ Source or Header  |  2005-03-20  |  6KB  |  192 lines

  1. /***************************************************************************
  2.                           xslfocode.cpp  -  description
  3.                              -------------------
  4.     begin                : Do 11.12.2003
  5.     copyright            : (C) 2003 by AndrΘ Simon
  6.     email                : andre.simon1@gmx.de
  7.  ***************************************************************************/
  8.  
  9. /***************************************************************************
  10.  *                                                                         *
  11.  *   This program is free software; you can redistribute it and/or modify  *
  12.  *   it under the terms of the GNU General Public License as published by  *
  13.  *   the Free Software Foundation; either version 2 of the License, or     *
  14.  *   (at your option) any later version.                                   *
  15.  *                                                                         *
  16.  ***************************************************************************/
  17.  
  18. #include "xslfogenerator.h"
  19.  
  20. using namespace std;
  21. namespace highlight {
  22.  
  23. XslFoGenerator::XslFoGenerator(const string &colourTheme,
  24.                                const string &enc,
  25.                                bool omitEnc,
  26.                                bool fopCompatible)
  27.     : CodeGenerator(colourTheme),
  28.      encoding(enc),
  29.      fopOutput(fopCompatible),
  30.      omitEncoding(omitEnc)
  31. {
  32.   styleTagOpen.push_back( getOpenTag(docStyle.getDefaultStyle()));
  33.   styleTagOpen.push_back( getOpenTag(docStyle.getStringStyle()));
  34.   styleTagOpen.push_back( getOpenTag(docStyle.getNumberStyle()));
  35.   styleTagOpen.push_back( getOpenTag(docStyle.getSingleLineCommentStyle()));
  36.   styleTagOpen.push_back( getOpenTag(docStyle.getCommentStyle()));
  37.   styleTagOpen.push_back( getOpenTag(docStyle.getEscapeCharStyle()));
  38.   styleTagOpen.push_back( getOpenTag(docStyle.getDirectiveStyle()));
  39.   styleTagOpen.push_back( getOpenTag(docStyle.getDirectiveStringStyle()));
  40.   styleTagOpen.push_back( getOpenTag(docStyle.getLineStyle()));
  41.   styleTagOpen.push_back( getOpenTag(docStyle.getSymbolStyle()));
  42.   snl << "  <fo:block font-size=\""
  43.       << docStyle.getFontSize()
  44.       << "pt\" font-family=\"Courier\" white-space-collapse=\"false\" "
  45.       << "wrap-option=\"wrap\" line-height=\"12pt\" background-color=\"#"
  46.       << (docStyle.getBgColour().getHexRedValue())
  47.       << (docStyle.getBgColour().getHexGreenValue())
  48.       << (docStyle.getBgColour().getHexBlueValue())
  49.       << "\">";
  50.  
  51.  for (int i=0;i<NUMBER_BUILTIN_STYLES; i++)
  52.   {
  53.     styleTagClose.push_back( "</fo:inline>");
  54.   }
  55.   if (fopOutput)
  56.     newLineTag ="</fo:block>\n<fo:block>";
  57.   else
  58.     newLineTag ="</fo:block>\n"+ snl.str();
  59.  
  60.   spacer = " ";
  61. }
  62.  
  63. XslFoGenerator::XslFoGenerator()
  64. {}
  65. XslFoGenerator::~XslFoGenerator()
  66. {}
  67.  
  68. string  XslFoGenerator::getOpenTag(const ElementStyle &elem)
  69. {
  70.   ostringstream s;
  71.   s  << "<fo:inline color=\"#"
  72.      << (elem.getColour().getHexRedValue())
  73.      << (elem.getColour().getHexGreenValue())
  74.      << (elem.getColour().getHexBlueValue())
  75.      << "\"";
  76.    s << ( elem.isBold() ?" font-weight=\"bold\"" :"" )
  77.      << ( elem.isItalic() ?" font-style=\"italic\"" :"" )
  78.      << ( elem.isUnderline() ?" text-decoration=\"underline\"" :"" );
  79.    s << ">";
  80.   return  s.str();
  81. }
  82.  
  83. string XslFoGenerator::getHeader(const string & title)
  84. {
  85.    ostringstream os;
  86.    os << "<?xml version=\"1.0\"";
  87.    if (!omitEncoding) {
  88.        os << " encoding=\"" << encoding << "\"";
  89.    }
  90.    os << "?>\n<fo:root xmlns:fo=\"http://www.w3.org/1999/XSL/Format\">\n"
  91.       << "<fo:layout-master-set>\n"
  92.       << "<fo:simple-page-master master-name=\"DINA4\"\n"
  93.       << "    page-height=\"29.7cm\"\n"
  94.       << "    page-width=\"21cm\"\n"
  95.       << "    margin-top=\"1cm\"\n"
  96.       << "    margin-bottom=\"2cm\"\n"
  97.       << "    margin-left=\"2.5cm\"\n"
  98.       << "    margin-right=\"2.5cm\">\n"
  99.       << "<fo:region-body />\n"
  100.       << "</fo:simple-page-master>\n"
  101.       << "<fo:page-sequence-master master-name=\"basic\">\n"
  102.       << "<fo:repeatable-page-master-alternatives>\n"
  103.       << "<fo:conditional-page-master-reference master-reference=\"DINA4\" />\n"
  104.       << "</fo:repeatable-page-master-alternatives>\n"
  105.       << "</fo:page-sequence-master>\n"
  106.       << "</fo:layout-master-set>\n\n"
  107.       << "<fo:page-sequence master-reference=\"basic\">\n"
  108.       << " <fo:flow flow-name=\"xsl-region-body\">\n";
  109.    if (fopOutput)
  110.      os << snl.str()<< "<fo:block>";
  111.    else
  112.      os << snl.str();
  113.  
  114.   return  os.str();
  115. }
  116.  
  117. /** gibt RTF-Text aus */
  118. void XslFoGenerator::printBody()
  119. {
  120.   processRootState();
  121. }
  122.  
  123.  
  124. string XslFoGenerator::getFooter()
  125. {
  126.   ostringstream os;
  127.   if (fopOutput)
  128.     os <<"\n</fo:block>";
  129.   os <<"\n</fo:block>\n </fo:flow>\n</fo:page-sequence>\n</fo:root>"<<endl
  130.      << "<!-- XSL-FO generated by Highlight "
  131.      << HIGHLIGHT_VERSION
  132.      << ", "
  133.      << HIGHLIGHT_URL
  134.      <<" -->\n";
  135.   return os.str();
  136. }
  137.  
  138. /** Gibt RTF-Code der Sonderzeichen zurueck */
  139. string XslFoGenerator::maskCharacter(unsigned  char c)
  140. {
  141.   switch (c)
  142.     {
  143.       case '<' :
  144.       return "<";
  145.       break;
  146.     case '>' :
  147.       return ">";
  148.       break;
  149.     case '&' :
  150.       return "&";
  151.       break;
  152.     case '\"' :
  153.       return """;
  154.       break;
  155.  
  156. // skip  first byte of multibyte chracters
  157.     /*#ifndef _WIN32
  158.     case 195:
  159.       return string("");
  160.       break;
  161. #endif*/
  162.  
  163.     default:
  164.       string m;
  165.       m += c;
  166.       return m;
  167.     }
  168. }
  169.  
  170. /*string XslFoGenerator::getNewLine(){
  171.   string nlStr;
  172.  
  173.   if (currentState!=_UNKNOWN){
  174.       nlStr+=styleTagClose[getStyleID(currentState, currentKeywordClass)];
  175. }
  176.   nlStr += newLineTag;
  177.   if (currentState!=_UNKNOWN){
  178.       nlStr+=styleTagOpen[getStyleID(currentState, currentKeywordClass)];
  179. }
  180.   return nlStr;
  181. }*/
  182.  
  183. string XslFoGenerator::getMatchingOpenTag(unsigned int styleID){
  184.  return getOpenTag(docStyle.getKeywordStyle(langInfo.getKeywordClasses()[styleID]));
  185. }
  186.  
  187. string XslFoGenerator::getMatchingCloseTag(unsigned int styleID){
  188.   return "</fo:inline>";
  189. }
  190.  
  191. }
  192.